package org.jeecg.modules.miniAppCustomerEndPoint.controller;

import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.util.RedisUtil;
import org.jeecg.modules.hc.entity.HcUser;
import org.jeecg.modules.hc.service.IHcUserService;
import org.jeecg.modules.jx.utils.JxCryptUtil;
import org.jeecg.modules.miniAppCustomerEndPoint.constant.JxCustomerConstant;
import org.jeecg.modules.miniAppCustomerEndPoint.constant.JxRedisConstant;
import org.jeecg.modules.miniAppCustomerEndPoint.entity.JxUserDo;
import org.jeecg.modules.miniAppCustomerEndPoint.mapper.JxUserMapper;
import org.jeecg.modules.miniAppCustomerEndPoint.service.JxUserServiceImpl;
import org.jeecg.modules.miniAppCustomerEndPoint.utils.JxUserUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;

/**
 * @Description: 用户
 * @Author: jeecg-boot
 * @Date: 2022-12-13
 * @Version: V1.0
 */
@Api(tags = "用户")
@RestController
@RequestMapping("/jx/jxUser")
@Slf4j
public class JxUserController extends JeecgController<HcUser, IHcUserService> {
    @Autowired
    private JxUserServiceImpl jxUserServiceImpl;

    @Autowired
    private JxUserMapper jxUserMapper;

    @Autowired
    private RedisUtil redisUtil;

    @Autowired
    private JxCryptUtil jxCryptUtil;

    /**
     * 每当用户打开一次 点餐小程序，统计一次，统计 PV 值
     * 只是将 redis中的 hc_day_views_yyyy-MM-dd 的值 加 1；不写入数据库
     * @return
     */
    @ApiOperation("用户每次进入小程序，小程序向后端发送一次消息，用于统计pv值")
    @GetMapping("/sendPageViewEvent")
    public Result<?> countDayViews(@RequestParam("siteId") String siteId) {

        String yyyyMMdd = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        String redisKey = JxRedisConstant.JX_DAY_VIEWS + yyyyMMdd;
        Double currentPv = redisUtil.zSetIncrBy(redisKey, siteId, 1);

        HashMap<String,Object> resultData = new HashMap<>();
        resultData.put("siteId", siteId);
        resultData.put("pv", currentPv.intValue());

        return Result.ok(resultData);
    }

    /**
     * 接口 1.17
     * 功能描述：
     *      当用户打开微信小程序时，小程序端调用 wx.login() 方法，从微信平台获取一个由微信平台生成的，只能使用一次的 code
     *  后端服务以code作为接口调用参数，向微信平台发送请求，请求获取用户的 open_id 和 access_token，access_token 只有2小时有效期，该access_token 主要是给 小程序端用来调用 wx.xxxx() 接口的
     *  本方法返回的token，是业务系统自己生成的token，仅包含了 openid，没有包含 微信平台返回的，可以调用微信接口的 access_token；
     *
     * @param code 小程序端调用 wx.login() 接口从 微信平台获取到的一次性的code
     * @return JWT 格式的字符串，格式为 {"alg":"HMAC256","typ":"JWT"}.{"username":"hc_user_login_token_<openid>"}.HMAC256(xxx)
     * @throws Exception
     */
    @ApiOperation("登录")
    @GetMapping("/loginForWx")
    public Result<?> loginForWx(@RequestParam String code) throws Exception {
        return Result.ok(jxUserServiceImpl.loginForWx(code));
    }

    /**
     * 接口 3.18
     * @param request
     * @param userIdForDebug
     * @return
     * @throws Exception
     */
    @ApiOperation("登出，退出登录")
    @GetMapping("/logoutForWx")
    public Result<?> logoutForWx(
            HttpServletRequest request,
            @RequestParam(value = "userId" , required = false) String userIdForDebug) throws Exception {

        String token = request.getHeader("X-Access-Token");
        String userId = JxUserUtil.getUserId(token, userIdForDebug);
        // 删除token
        redisUtil.del(JxCustomerConstant.JX_PREFIX_USER_TOKEN + userId);
        return Result.ok("退出登录成功");
    }

    /**
     * 接口3.4 我的页面，左上角，展示用户 昵称，id，头像，钱包余额，优惠券个数，积分
     * @param userId
     * @return
     */
    @GetMapping("/queryUserBasicInfo")
    public Result<?> queryUserBasicInfo(
            HttpServletRequest request,
            @RequestParam(value = "userId" , required = false) String userId) {
        String token = request.getHeader("X-Access-Token");
        String userId2 = JxUserUtil.getUserId(token, userId);
        JSONObject userInfo = jxUserServiceImpl.getUserBasicInfo(userId2);

        return Result.ok(userInfo);
    }

    /**
     * 接口 3.15 提交订单时，从后端获取用户保存的 取餐地址，手机号，取餐用户名等信息
     * @param request
     * @param userIdForDebug
     * @return
     */
    @GetMapping("/queryUserPickUpAddress")
    public Result<?> queryUserPickUpAddress(
            HttpServletRequest request,
            @RequestParam(value = "userIdForDebug" , required = false) String userIdForDebug) {

        String token = request.getHeader("X-Access-Token");
        String userId = JxUserUtil.getUserId(token, userIdForDebug);

        JxUserDo jxUserDo = jxUserMapper.selectById(userId);
        if (jxUserDo == null) {
            return Result.error(404,"查询不到用户的收获地址信息，需要用户自己进行填写", "查询不到用户的收获地址信息，需要用户自己进行填写");
        } else {
            JSONObject userPickupAddress = new JSONObject();
            userPickupAddress.put("name", jxUserDo.getNameTakingMeal());
            userPickupAddress.put("phone", jxUserDo.getPhone());
            String[] addresses = jxUserDo.getPickupAddressName().trim().split("-");
            if (addresses != null && addresses.length == 2) {
                // 由于存入表中时，将用户挑选的大厦名或楼层名中可能包含的短线 - 替换成了 下划线 _ ， 然后 再使用短线拼接；因此，当分割时，先通过 短线分割，然后再将 下划线_ 还原成 短线-
                userPickupAddress.put("building", addresses[0].replace("_", "-"));
                userPickupAddress.put("floor", addresses[1].replace("_", "-"));
            } else {
                userPickupAddress.put("building", null);
                userPickupAddress.put("floor", null);
            }

            return Result.ok(userPickupAddress);
        }
    }


    /**
     * 接口 3.16 当用户修改取餐地址，手机号，用户名等信息后，通过该接口更新 取餐地址信息
     * @param request
     * @param userIdForDebug
     * @param requestBody
     * @return
     */
    @PostMapping("/saveUserPickupAddress")
    public Result<?> saveUserPickupAddress(
            HttpServletRequest request,
            @RequestParam(value = "userIdForDebug" , required = false) String userIdForDebug,
            @RequestBody() JSONObject requestBody) {

        String token = request.getHeader("X-Access-Token");
        String userId = JxUserUtil.getUserId(token, userIdForDebug);
        String name = requestBody.getString("name");
        String phone = requestBody.getString("phone");
        // 由于在表中，只有一个字段来记录大厦+楼层 拼接成的取餐地址，且通过 - 短线进行拼接；因此，如果大厦名或楼层名称中 有 短线 - ，先替换成 下划线 _
        String building = requestBody.getString("building").replace("-", "_");
        String floor = requestBody.getString("floor").replace("-", "_");
        String pickUpAddress = building + "-" + floor;

        JxUserDo jxUserDo = jxUserMapper.selectById(userId);
        if (jxUserDo == null) {
            jxUserDo = new JxUserDo();
            jxUserDo.setNameTakingMeal(name);
            jxUserDo.setPhone(phone);
            jxUserDo.setPickupAddressName(pickUpAddress);

            jxUserMapper.insert(jxUserDo);
        } else {
            jxUserMapper.updateUserPickUpAddress(userId, name, phone, pickUpAddress);
        }

        return Result.ok("用户取餐信息更新成功");
    }

}
